import sys
import string
import itertools
import subprocess

password_range = string.digits + string.ascii_letters  # ascii_letters是包含了所有英文大小写字母的列表，digits是包含了0-9数字的列表。将这两者相加后，可以得到一个所有大小写字母加数字合起来的列表。这个列表就是我们密码中，单个字符的选择范围。
password_len = 3  # 密码位数。这条代码将尝试3位密码
passwords = itertools.product(password_range, repeat=password_len)  # 迭代器生成，第一个参数是密码单个字符的范围，第二个参数是密码长度
for pwd in passwords:
    # 由于pwd里保存的密码是迭代器重复生成的，生成的是一个类似('a', 'b', 'c')的结构，将其转变成纯粹的'abc'字符串需要如下3行代码的操作
    password = ''
    for p in pwd:
        password = password + p
    cmd = '"C:\\Program Files\\7-Zip\\7z.exe" e -p{} -y C:\\share\\加密压缩包.zip'.format(password)  # format函数会将字符串中的{}替换成函数括号内的参数，在这里就是密码
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 请查看知识点中的标准输出获取更多解释
    out, err = p.communicate()  # 从命令输出中获取标准输出和错误输出，分别赋值给out和err变量
    err = str(err)  # 标准输出和错误输出都是以比特的形式输出的，需要用str()函数将其转换成字符串。
    if 'Wrong password' not in err:
        print('找回成功！密码是：{}'.format(password))  # 找到密码
        sys.exit()  # 密码找到后，直接退出程序
